#!/usr/bin/env node

const inquirer = require("inquirer")
const ejs = require("ejs")
const fs = require("fs")
const path = require("path")
//保存用户输入的对象
let options = {}
//保存模板目录
const templateDir = "templates"

inquirer.prompt({
    type:"input",
    name:"name",
    message:"this is a practice",
    default:"practice",
}).then((answers)=>{
    options = {...options,...answers}
    return inquirer.prompt({
        type:"input",
        name:"name1",
        message:"this is a practice",
        default:"practice1",
    })
}).then((answers)=>{
    options = {...options,...answers}
    //转换代码要写在最后一个then中
    //模板的路径，要用__dirname
    let tempPath = path.join(__dirname,templateDir)
    //目标路径
    let destPath = process.cwd()
    //读模板目录结构,dir是绝对路径
    function findDir (dir) {
        //获取目录中的文件列表，并依次处理其中文件
        fs.readdirSync(dir).forEach((item)=>{
            //拼接当前文件路径
            let currentFile = path.join(dir,item)
            //取相对于templates目录的相对路径
            let relativePath = dir.replace(/^.*templates[\\]?/,"")
            //拼接成目标文件
            let destDir = path.join(destPath,relativePath)
            //由于不能创建不存在的目录中的文件，所以，当读取到item是目录时，先在目标目录创建item目录
            //因为fs.mkdirSync(path)判断""也是false,而初始的相对路径就是""，所以需要判断相对路径不为空并且不存在
            if(!!relativePath && !fs.existsSync(relativePath)){
                //创建该目录
                fs.mkdirSync(destDir)
            }
            //如果当前文件是目录
            if(fs.statSync(currentFile).isDirectory()){
                //就递归继续读取新目录
                findDir(currentFile)
            }else{
                //否则当前文件就是文件，直接套入模板并写入目标目录
                //替换模板中的特殊字符
                ejs.renderFile(currentFile,options,(err,result)=>{
                    //错误优先，报错则抛出异常
                    if (err) throw err
                    //拼接目标文件并写入
                    fs.writeFileSync(path.join(destDir,item),result)
                })
            }
            
        })
    }
    //调用核心方法
    findDir(tempPath)
})